include ../build/Makefile-vars

# OPT     = -OReleaseFast
# OPT     = -OReleaseSafe
OPT     = -OReleaseSmall
# OPT     = -ODebug

all: deps ${DIST}/.built python

include ../build/Makefile-rules

CPYTHON_WASM = $(shell cowasm-package-path @cowasm/cpython)
POSIX_WASM = $(shell cowasm-package-path @cowasm/posix-wasm)

CFLAGS = -I$(shell cowasm-package-path @cowasm/cpython)/include/python3.11 -I$(shell cowasm-package-path @cowasm/posix-wasm)
LDFLAGS = -L${BUILD} -lpython3.11

###
# Python as a web assembly library with a few extras compiled in
# needed be usable.
###

# This is a little complicated because we *might* have the
# libpython3.11.a compressed in the @cowasm/cpython package,
# since it is 25MB and so rarely needed, except here.
# It's compressed when uploaded to npmjs.com, but not compressed
# when used via the workspace.
${BUILD}/libpython3.11.a:
	cp ${CPYTHON_WASM}/lib/libpython3.11.a* ${BUILD}
	@[[ -f ${BUILD}/libpython3.11.a ]] || xz -d ${BUILD}/libpython3.11.a.xz


${BUILD}/libpython.o:
	mkdir -p ${BUILD}
	cd ../build && make zig
	${BIN}/cowasm-cc -Oz ${CFLAGS} \
		-c ${CPYTHON_WASM}/lib/libpython.c \
		-o ${BUILD}/libpython.o

${DIST}/python.wasm: src/python.zig src/signal.zig ${BUILD}/libpython.o ${BUILD}/libpython3.11.a
	cd ../build && make zig
	mkdir -p ${DIST}
	cd src/ \
		&& ${BIN}/cowasm-zig \
			-cowasm-verbose \
			${OPT} \
			${CFLAGS} \
			${LDFLAGS} \
			python.zig \
			${BUILD}/libpython.o \
		&& rm python.o \
		&& mv python.wasm ${DIST}/python.wasm

BUNDLES = ${DIST}/python-minimal.zip ${DIST}/python-readline.zip ${DIST}/python-stdlib.zip ${DIST}/python-everything.zip


${DIST}/python-minimal.zip:
	mkdir -p ${DIST}
	cp ${CPYTHON_WASM}/lib/dist/python-minimal.zip ${DIST}

${DIST}/python-readline.zip:
	mkdir -p ${DIST}
	cp ${CPYTHON_WASM}/lib/dist/python-readline.zip ${DIST}

${DIST}/python-stdlib.zip:
	mkdir -p ${DIST}
	cp ${CPYTHON_WASM}/lib/dist/python-stdlib.zip ${DIST}

PYTHON_PACKAGES = ${DIST}/Cython.tar.xz ${DIST}/mpmath.tar.xz ${DIST}/numpy.tar.xz ${DIST}/sympy.tar.xz ${DIST}/pandas.tar.xz ${DIST}/pytz.tar.xz ${DIST}/dateutil.tar.xz ${DIST}/six.tar.xz

${DIST}/Cython.tar.xz:
	mkdir -p ${DIST}
	cd $(shell cowasm-package-path @cowasm/py-cython) && tar -Jcf ${DIST}/Cython.tar.xz Cython

${DIST}/mpmath.tar.xz:
	mkdir -p ${DIST}
	cd $(shell cowasm-package-path @cowasm/py-mpmath) && tar -Jcf ${DIST}/mpmath.tar.xz mpmath

${DIST}/numpy.tar.xz:
	mkdir -p ${DIST}
	cd $(shell cowasm-package-path @cowasm/py-numpy) && tar -Jcf ${DIST}/numpy.tar.xz numpy

${DIST}/pandas.tar.xz:
	mkdir -p ${DIST}
	cd $(shell cowasm-package-path @cowasm/py-pandas) && tar -Jcf ${DIST}/pandas.tar.xz pandas

${DIST}/pytz.tar.xz:
	mkdir -p ${DIST}
	cd $(shell cowasm-package-path @cowasm/py-pandas) && tar -Jcf ${DIST}/pytz.tar.xz pytz

${DIST}/dateutil.tar.xz:
	mkdir -p ${DIST}
	cd $(shell cowasm-package-path @cowasm/py-pandas) && tar -Jcf ${DIST}/dateutil.tar.xz dateutil

${DIST}/six.tar.xz:
	mkdir -p ${DIST}
	cd $(shell cowasm-package-path @cowasm/py-pandas) && tar -Jcf ${DIST}/six.tar.xz six

${DIST}/sympy.tar.xz:
	mkdir -p ${DIST}
	cd $(shell cowasm-package-path @cowasm/py-sympy) && tar -Jcf ${DIST}/sympy.tar.xz sympy

${DIST}/python-everything.zip: ${DIST}/python-stdlib.zip ${PYTHON_PACKAGES} ${DIST}/python.wasm
	cd ${DIST} \
		&&	cp python-stdlib.zip .python-everything.zip \
		&&  zip .python-everything.zip *.tar.xz python.wasm \
		&&  mv .python-everything.zip python-everything.zip



.PHONY: python
python: ${DIST}/python.wasm hello hellozig ${BUNDLES} ${PYTHON_PACKAGES}


###
# An example minimal Python extension module, written in C.
###

PLATFORM = cpython-311-wasm32-wasi

${DIST}/hello.${PLATFORM}.so: src/extension/hellomodule.c
	cd ../build && make zig
	${BIN}/cowasm-cc -Oz ${CFLAGS} -shared  \
		src/extension/hellomodule.c -o ${DIST}/hello.${PLATFORM}.so

.PHONEY: hello
hello: ${DIST}/hello.${PLATFORM}.so

###
# An example minimal Python extension module, written in Zig.
###

${DIST}/hellozig.${PLATFORM}.so: src/extension/hellozigmodule.zig src/extension/hellozigmodule.c
	cd ../build && make zig
	cd src/extension \
		&&	${BIN}/cowasm-cc ${CFLAGS} -Oz -c hellozigmodule.c -o hellozigmodule-c.o \
		&&	${BIN}/cowasm-zig ${CFLAGS} ${OPT} hellozigmodule-c.o hellozigmodule.zig \
		&&	rm hellozigmodule-c.o \
		&&  mv hellozigmodule.wasm ${DIST}/hellozig.${PLATFORM}.so

.PHONEY: hellozig
hellozig: ${DIST}/hellozig.${PLATFORM}.so

###
# Node related makefile wrapping...
###

${DIST}/.built:
	mkdir -p ${DIST}
	npx tsc
	touch ${DIST}/.built


###
# Testing
###

.PHONY: test
test: all
	npm run test
